EmbeddingLookup

传入一个矩阵和一组索引,根据给定的索引提取对应的行(向量),若此行不曾被标记为“已正则化”,则对此行进行正则化处理,将结果拼接输出,若已经正则化过则直接输出。

\[\begin{split}\forall k \in [1, ids\_size], \quad \begin{cases} \text{if } \textbf{is_regulated}[i_k] = 0, & \begin{cases} \displaystyle X_{i_k} \leftarrow X_{i_k} \cdot \frac{\text{max_norm}} {\sum_{j=1}^{layer\_size\_} X_{i_k, j}} \\[10pt] \textbf{is_regulated}[i_k] \leftarrow 1 \end{cases} \\[12pt] \text{输出向量 } Y_k \leftarrow X_{i_k} \end{cases}\end{split}\]
输入:
  • input_data - 输入矩阵数据地址。

  • ids - 输入索引的存储地址。

  • max_norm - 最大范数约束。

  • is_regulated - 记录矩阵行是否被正则化的标志数组。

  • ids_size_ - 输入索引个数。

  • layer_size_ - 输入矩阵的列数。

  • layer_num_ - 输入矩阵的行数。

  • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

输出:
  • output - 结果输出地址。

支持平台:

FT78NE MT7004

备注

  • FT78NE 支持fp32

  • MT7004 支持fp16, fp32

共享存储版本:

void hp_embeddinglookup_s(half *input_data, int *ids, half *output, half max_norm_, bool *is_regulated, int ids_size_, int layer_size_, int layer_num_, int core_mask)
void fp_embeddinglookup_s(float *input_data, int *ids, float *output, float max_norm_, bool *is_regulated, int ids_size_, int layer_size_, int layer_num_, int core_mask)

C调用示例:

 1//FT78NE示例
 2#include <stdio.h>
 3#include <embeddinglookup.h>
 4
 5int main(int argc, char* argv[]) {
 6    float *input_data = (float *)0xA0000000;   //input在DDR空间
 7    float *output_data = (float *)0xA0872c00;
 8    int layer_size = 4;//列
 9    int layer_num = 5;//行
10    float max_norm = 4.5;
11    int ids[]={0,1,3};
12    int ids_size  = 3;//提取三行
13    bool *output = (bool *)0xC0000000;
14    bool is_regulated_[5] = {0};//layer_num
15    int core_mask = 0xff;
16    fp_embeddinglookup_s(input_data, ids, output_data, max_norm, is_regulated_, ids_size, layer_size, layer_num, core_mask);
17    return 0;
18}

私有存储版本:

void hp_embeddinglookup_p(half *Input0, half *Input1, bool *output, int length)
void fp_embeddinglookup_p(float *Input0, float *Input1, bool *output, int length)

C调用示例:

 1//FT78NE示例
 2#include <stdio.h>
 3#include <embeddinglookup.h>
 4
 5int main(int argc, char* argv[]) {
 6    float *input_data = (float *)0x10810000;   //input在DDR空间
 7    float *output_data = (float *)0x10820000;
 8    int layer_size = 4;//列
 9    int layer_num = 5;//行
10    float max_norm = 4.5;
11    int ids[]={0,1,3};
12    int ids_size  = 3;//提取三行
13    bool *output = (bool *)0xC0000000;
14    bool is_regulated_[5] = {0};//layer_num
15    fp_embeddinglookup_s(input_data, ids, output_data, max_norm, is_regulated_, ids_size, layer_size, layer_num);
16    return 0;
17}